﻿package  {

	import flash.display.MovieClip;
	import flash.display.Scene;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.net.URLLoader;
	import flash.system.System;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFieldType;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import flash.utils.Timer;
	
	import playerio.Client;
	import playerio.Connection;
	import playerio.Message;
	import playerio.PlayerIO;
	import playerio.PlayerIOError;
	
	import sample.ui.Lobby;
	import sample.ui.components.Label;
	/**
	 * @author Fourth World
	 * @since 1.0
	 * Clase que comienza a ejecutar el juego declarando todas las variables que se necesitan y principales funciones o metodos del juego.
	 */
	public class Main  extends MovieClip {
		
		
		
		private var preguntaCerrada: Boolean = true;
		//La variable que maneja la conexion cliente-servidor
		private var connection:Connection;
		//Numero de pregunta generado tanto para pregunta abierta como para pregunta cerrada
		private var aleatorio : Number ;		
		//Boton de iniciar sesion
		private var inicioButton: InicioButton = new InicioButton();
		//Formato para los titulos que se muestran
		private var formatoTitulos: TextFormat = new TextFormat();
		//Formato para los textos que se muestran
		private var formatoTextos: TextFormat = new TextFormat();
		//Caja de texto donde el usuario dijita su nombre
		private var nombre:TextField = new TextField();
		//Variable que contiene el nombre del jugador (para todo el juego)
		private var nombreJugador:String = new String();
		//Caja de texto donde el usuario dijita su contraseña
		private var contrasenia:TextField = new TextField();
		//Campo para ingresar la IP
		private var ip:TextField = new TextField();
		//Label de IP
		private var labelIP:TextField = new TextField();
		//Label de Caso de Uso
		private var casoDeUsoLabel:CasoDeUsoLabel = new CasoDeUsoLabel;
		//Boton de Validar Respuestas Abiertas
		private var validarAbiertasButton: ValidarRespuestasAbiertasButton = new ValidarRespuestasAbiertasButton();
		//Boton de Validar Respuestas Cerradas
		private var validarCerradasButton: ValidarRespuestasCerradasButton = new ValidarRespuestasCerradasButton();
		//Label donde se va a mostrar la Pregunta
		private var preguntaLabel:TextField = new TextField();
		//Boton Opcion 1
		private var opcion1Button:Opcion1Button = new Opcion1Button();
		//Campo para mostrar la opción A
		private var opcionA : TextField = new TextField();
		//Boton Opcion 2
		private var opcion2Button:Opcion2Button = new Opcion2Button();
		//Campo para mostrar la opción B
		private var opcionB : TextField = new TextField();
		//Boton Opcion 3
		private var opcion3Button:Opcion3Button = new Opcion3Button();
		//Campo para mostrar la opción C
		private var opcionC : TextField = new TextField();
		//Boton Opcion 4
		private var opcion4Button:Opcion4Button = new Opcion4Button();
		//Campo para mostrar la opción D
		private var opcionD : TextField = new TextField();
		//Campo para digitar las respuestas a preguntas abiertas.
		public static var respuestaAbierta:TextField = new TextField();
		//variable que recibe todas las preguntas que se cargan del XML
		private var preguntas : Preguntas = new Preguntas();
		
		//----------------------------------------------------Necesario para crear el lobby----------------
		private var tiles:Array = [];
		private var hasTurn:Boolean = false
		private var isInited:Boolean = false
		private var imPlayer:Number;
		private var isSpectator:Boolean = false
		private var lobby:Lobby
		//Botones del Teclado
		private var teclado0Button:Teclado0Button = new Teclado0Button();
		private var teclado1Button:Teclado1Button = new Teclado1Button();
		private var teclado2Button:Teclado2Button = new Teclado2Button();
		private var teclado3Button:Teclado3Button = new Teclado3Button();
		private var teclado4Button:Teclado4Button = new Teclado4Button();
		private var teclado5Button:Teclado5Button = new Teclado5Button();
		private var teclado6Button:Teclado6Button = new Teclado6Button();
		private var teclado7Button:Teclado7Button = new Teclado7Button();
		private var teclado8Button:Teclado8Button = new Teclado8Button();
		private var teclado9Button:Teclado9Button = new Teclado9Button();
		private var tecladoBorrarButton:TecladoBorrarButton = new TecladoBorrarButton();
		private var tecladoEnviarButton:TecladoEnviarButton = new TecladoEnviarButton();
		//Elementos de Validacion de entrada de texto
		private var asterisco1:TextField = new TextField();
		private var asterisco2:TextField = new TextField();
		private var mensajeError:TextField = new TextField();
		private var esteMain:Main;
		//Contador de los 15 segundos
		public static var minuteTimer:Timer = new Timer(1000, 15);
		//Contador para redireccionar despues de acabar una ronda de preguntas
		public static var redireccionar:Timer = new Timer(1000, 20);
		/**
		 * Este constructor inicia el cliente mostrando al jugador los campos para ingresar el usuario, contraseña e IP del servidor.
		 */
		public function Main ()
		{
			esteMain = this;
			gotoAndStop(1,"Escena 1");
			//Construccion del campo para ingresar el nombre
			nombre.type = TextFieldType.INPUT;
			nombre.height = 32,20;
			nombre.width = 213;
			nombre.x = 175;
			nombre.y = 130;
			nombre.defaultTextFormat = formatearTitulos();
			nombre.textColor = 0x000000;
			addChild(nombre);
			//Construccion del campo para ingresar la contraseña
			contrasenia.type = TextFieldType.INPUT;
			contrasenia.displayAsPassword = true;
			contrasenia.height = 32,20;
			contrasenia.width = 213;
			contrasenia.border = false;
			contrasenia.borderColor = 0x000000;
			contrasenia.textColor = 0xD7A500;
			contrasenia.x = 175;
			contrasenia.y = 185;
			contrasenia.defaultTextFormat = formatearTitulos();
			contrasenia.textColor = 0x000000;
			addChild(contrasenia);
			 
			//Construccion del campo para ingresar la IP
			ip.type = TextFieldType.INPUT;
			ip.height = 32,20;
			ip.width = 213;
			ip.border = false;
			ip.borderColor = 0x000000;
			ip.x=175;
			ip.y=235; 
			ip.textColor = 0xD7A500;
			ip.text = "localhost";	
			ip.setTextFormat(formatearTitulos());
			ip.textColor = 0x000000;
			addChild(ip);
			//Construccion del boton de iniciar sesion
			inicioButton.x = 175;
			inicioButton.y = 280;
			addChild(inicioButton);
			inicioButton.addEventListener(MouseEvent.CLICK, onClickInicioButton);
		}
		
		/**
		 * Esta funcion se ejecuta al oprimir el boton iniciar sesion. Se comprueba que se ha
		 * escrito un nombre de usuario con su contraseña y se establece conexion con el servidor.
		 * @param mouseEvent El evento que ha generado el usuario al dar click al boton enviar.
		 */
		public function onClickInicioButton( mouseEvent:MouseEvent):void
		{
			asterisco1.text = "";
			asterisco2.text = "";
			mensajeError.text = "";
			mensajeError.width = 200;
			mensajeError.height = 30;
			var formato:TextFormat = new TextFormat();
			formato.size = 24;
			formato.color = 0xFF0000;
			formato.bold = true;
			formato.italic = true;
			formato.font = "Comic Sans MS";
			
			trace("SE HA OPRIMIDO EL BOTON");
			if ((nombre.text.length == 0) && (contrasenia.text.length == 0)) {
				asterisco1.x = 500;
				asterisco1.y = 171,80;
				asterisco1.text = "*";
				asterisco1.setTextFormat(formato);
				addChild(asterisco1);
				asterisco2.x = 500;
				asterisco2.y = 215;
				asterisco2.text = "*";
				asterisco2.setTextFormat(formato);
				addChild(asterisco2);
				mensajeError.x = 300;
				mensajeError.y = 250;
				mensajeError.text = "* Campo Obligatorio.";
				mensajeError.setTextFormat(formato);
				addChild(mensajeError);
				trace("NO SE HAN INTRODUCIDO NOMBRE Y CONTRASEÑA");
			} else if (nombre.text.length == 0) {
				asterisco1.x = 500;
				asterisco1.y = 171,80;
				asterisco1.text = "*";
				asterisco1.setTextFormat(formato);
				addChild(asterisco1);
				mensajeError.x = 300;
				mensajeError.y = 250;
				mensajeError.text = "* Campo Obligatorio.";
				mensajeError.setTextFormat(formato);
				addChild(mensajeError);
				trace("NO SE HA INTRODUCIDO UN NOMBRE");
			} else if (contrasenia.text.length == 0) {
				asterisco2.x = 500;
				asterisco2.y = 215;
				asterisco2.text = "*";
				asterisco2.setTextFormat(formato);
				addChild(asterisco2);
				mensajeError.x = 300;
				mensajeError.y = 250;
				mensajeError.text = "* Campo Obligatorio.";
				mensajeError.setTextFormat(formato);
				addChild(mensajeError);
				trace("NO SE HA INTRODUCIDO UNA CONTRASEÑA");
			} else if ((nombre.text.length != 0) && (contrasenia.text.length != 0)) {
				gotoAndStop(2);
				nombre.visible = false;
				contrasenia.visible = false;
				inicioButton.visible = false;
				ip.visible=false;
				nombreJugador = nombre.text;
				conectar();
			}
			
		}
		/**
		 * Esta funcion establece la conexion con el servidor, le indica al servidor
		 * el nombre del jugador y muestra el lobby.
		 * @param client El cliente que desea conectarse al servidor. 
		 */
		private function handleConnect(client:Client):void{
			trace("Sucessfully connected to player.io");
			//Set developmentsever (Comment out to connect to your server online)
			client.multiplayer.developmentServer = ip.text+":8184";
			//Create lobby
			lobby = new Lobby(client, "Triviador", handleJoin, handleError)
			//Show lobby (parsing true hides the cancel button)
			lobby.show(true);
			gotoAndStop(2);
		}
		

		/**
		 * Se establece una conexion con el servidor de PLAYERIO.
		 */
		private function conectar():void{
			PlayerIO.connect(
				stage,								//Referance to stage
				"triviador-zh6t1rvdteo5wgqxlzm3q",	//Game id
				"public",							//Connection id, default is public
				nombre.text,						//Username
				"",									//User auth. Can be left blank if authentication is disabled on connection
				null,								//Current PartnerPay partner.
				handleConnect,						//Function executed on successful connect
				handleError							//Function executed if we recive an error
			);  
		}
		/**
		 *  El usuario ha ingresado a una partida, esta partida tiene una conexión en especifico a la que
		 * hay que añadirle todos los posibles mensajes que puede enviar el servidor para que al ser recibido
		 * cada mensaje el cliente sepa que hacer.
		 * @param connection Es la conexion de la partida que debe ser igualada a la conexion del cliente
		*/
		private function handleJoin(connection:Connection):void{
			trace("Sucessfully connected to the multiplayer server");
			//Add connection to actual connection
			this.connection = connection;
			
			//Add disconnect listener
			connection.addDisconnectHandler(handleDisconnect);
		    
			//Add listener for messages of the type "hello"
			connection.addMessageHandler("hello", function(m:Message):void {
				trace("Recived a message with the type hello from the server");			 
			})
				
			connection.addMessageHandler("jugadoresCompletos", function(m:Message):void {
				trace("Recived a message with the type jugadoresCompletos from the server");
				SeleccionCasoDeUso();
			})
			
			//Add message listener for users joining the room
			connection.addMessageHandler("UserJoined", function(m:Message, userid:uint):void {
				trace("Player with the userid", userid, "just joined the room");
			})
			
				
			connection.addMessageHandler("Restart", function(m:Message):void {
				trace("RESTART");
				limpiarPantalla();
				gotoAndPlay(1, "Escena 1");
				inicioButton.visible = true;
				nombre.visible = true;
				contrasenia.visible = true;
				SeleccionCasoDeUso();
			})
			
			
			//Add message listener for users leaving the room
			connection.addMessageHandler("UserLeft", function(m:Message, userid:uint):void {
				trace("Player with the userid", userid, "just left the room");
			})
			
			//Listen to all messages using a private function
			connection.addMessageHandler("*", handleMessages)
			
			connection.addMessageHandler("preguntaAbierta", function(m:Message, numero:int):void {
				trace("Recived a message with the type PREGUNTA ABIERTA from the server");
				//Evento al pasar los 15 segundos
				minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				//Inicio del contador
				minuteTimer.reset();
				minuteTimer.start();
				stop();
				aleatorio = Number(numero);
				casoDeUsoLabel.visible = false;
				validarAbiertasButton.visible = false;
				validarCerradasButton.visible = false;
				MostrarPreguntaAbierta(Number(numero));
			})
				
			connection.addMessageHandler("preguntaCerrada", function(m:Message, numero:int):void {
				//Evento al pasar los 15 segundos
				minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				//Inicio del contador
				minuteTimer.reset();
				minuteTimer.start();
				trace("Recived a message with the type PREGUNTA CERRADA from the server");
				stop();
				aleatorio = Number(numero);
				casoDeUsoLabel.visible = false;
				validarCerradasButton.visible = false;
				validarCerradasButton.visible = false;
				MostrarPreguntaCerrada(Number(numero));
				MostrarOpcionesCerradas(Number(numero));
				preguntaCerrada = true;
			})
			 
			connection.addMessageHandler("Win", function(m:Message):void {
				trace("Recived a message with the type WIN from the server");
				limpiarPantalla();
				gotoAndStop(2,"Escena 7");
			})
				
			connection.addMessageHandler("Lose", function(m:Message):void {
				trace("Recived a message with the type LOSE from the server");
				limpiarPantalla();
				perder();
			})
				
			gotoAndStop(3,"Escena 7");
		}
		/**
		 * La funcion indica al servidor que al usuario se le ha agotado el tiempo, por tanto ha perdido y 
		 * se lo notifica al servidor y al usuario.
		 * @param event Evento que indica que el tirmpo que tiene el usuario se ha acabado
		 */
		public function onTimerComplete(event:TimerEvent):void 
		{ 
			trace("Time's Up!");
			
			if (preguntaCerrada)
			{
				connection.send("LosePregCerradas");
				trace("Tiempo agotado PREGUNTA CERRADA");
			}
			else
			{
				connection.send("Lose");
				trace("Tiempo agotado PREGUNTA ABIERTA");
			}
			perder();
			preguntaCerrada = false;
		} 
		
		/**
		 * Funcion que imprime el mensaje que se ha recibido. (unicamente lo imprime si se esta ejecutando
		 * el cliente en flash professional.
		 * @param m Mensaje de tipo Mensaje que se quiere imprimir
		 */
		private function handleMessages(m:Message):void {
			trace("Recived the message", m)
		}
		/** Esta funcion le indica al cliente que se ha desconectado del servidor
		* y lo indica mediante un mensaje por consola si se esta ejecutando el cliente en flash professional
		*/
		private function handleDisconnect():void{
			trace("Disconnected from server")
			conectar();
		}
		
		/** Esta funcion se ejecuta cuando halla un error en la conexion,
		* al haber un error en la conexion se redirige al usuario a iniciar sesion nuevamente
		 * @param error Error que ha arrojado la conexion 
		*/
		private function handleError(error:PlayerIOError):void{
			trace("got",error)
			gotoAndStop(1,"Escena 1");
			nombre.visible = true;
			contrasenia.visible = true;
			inicioButton.visible = true;
		}
		/**
		 * Muestra al usuario la ventana de seleccionar preguntas abiertas o cerradas
		 */
		public function SeleccionCasoDeUso():void {
			gotoAndStop(1,"Escena 2");
			dibujarSeleccionCasosDeUso();
			validarAbiertasButton.addEventListener(MouseEvent.CLICK, onClickValidarAbiertasButton);
			validarCerradasButton.addEventListener(MouseEvent.CLICK, onClickValidarCerradasButton);
		}
		
		/** Esta funcion se ejecuta cuando el usuario ha elegido validar respuestas abiertas.
		* El sistema muestra entonces una pregunta abierta (esta funcion le indica al servidor que todos los
		 * usuarios deben responder a una pregunta abierta).
		 * @param mouseEvent Evento generado por el usuario al hacer click
		*/ 		
		public function onClickValidarAbiertasButton( mouseEvent:MouseEvent):void
		{
			connection.send("preguntaAbierta");
		}
		
		/** Esta funcion se ejecuta cuando el usuario ha elegido validar respuestas cerradas.
		 * El sistema muestra entonces una pregunta cerrada (esta funcion le indica al servidor que todos los
		 * usuarios deben responder a una pregunta cerrada).
		 * @param mouseEvent Evento generado por el usuario al hacer click
		 */ 	
		public function onClickValidarCerradasButton( mouseEvent:MouseEvent):void
		{
			preguntaCerrada = true;
			connection.send("preguntaCerrada");
		}
		
		/** Esta funcion muestra una pregunta abierta, con un cuadro de texto donde el
		* usuario puede introducir la respuesta que quiera.
		 * @param numero Numero aleatorio para elegir la pregunta de la base de preguntas
		*/
		public function MostrarPreguntaAbierta(numero:Number):void {
			stop();
			preguntaCerrada =  false;
			gotoAndPlay(1,"Escena 5");
			dibujarMostrarPreguntaAbierta();
			var xml:XML;
			var loader:URLLoader = preguntas.Actions();
			loader.addEventListener(Event.COMPLETE, xmlLoaded);
			function xmlLoaded(e:Event):void {
				xml = new XML(e.target.data);
				preguntaLabel.text = xml.Preguntas.Tipo.abierta.Enunciado[numero];
			}
			
			teclado0Button.addEventListener(MouseEvent.CLICK, Teclado0Button.onClickTeclado0Button);
			teclado1Button.addEventListener(MouseEvent.CLICK, Teclado1Button.onClickTeclado1Button);
			teclado2Button.addEventListener(MouseEvent.CLICK, Teclado2Button.onClickTeclado2Button);
			teclado3Button.addEventListener(MouseEvent.CLICK, Teclado3Button.onClickTeclado3Button);
			teclado4Button.addEventListener(MouseEvent.CLICK, Teclado4Button.onClickTeclado4Button);
			teclado5Button.addEventListener(MouseEvent.CLICK, Teclado5Button.onClickTeclado5Button);
			teclado6Button.addEventListener(MouseEvent.CLICK, Teclado6Button.onClickTeclado6Button);
			teclado7Button.addEventListener(MouseEvent.CLICK, Teclado7Button.onClickTeclado7Button);
			teclado8Button.addEventListener(MouseEvent.CLICK, Teclado8Button.onClickTeclado8Button);
			teclado9Button.addEventListener(MouseEvent.CLICK, Teclado9Button.onClickTeclado9Button);
			tecladoBorrarButton.addEventListener(MouseEvent.CLICK, TecladoBorrarButton.onClickTecladoBorrarButton);
			tecladoEnviarButton.addEventListener(MouseEvent.CLICK, onClickTecladoEnviarButton);
			
		}
		
		/** Esta funcion muestra una pregunta cerrada, donde el
		* usuario puede elegir una de las opciones que se muestran.
		 * @param numero Numero aleatoreo para elegir la pregunta de la base de preguntas
		*/
		public function MostrarPreguntaCerrada(numero:Number) {
			
			gotoAndPlay(1,"Escena 4");
			preguntaCerrada = true;
			dibujarMostrarPreguntaCerrada();
			//Construccion de la pregunta cerrada
			
			var xml:XML;
			
			var loader:URLLoader = preguntas.Actions();
			
			loader.addEventListener(Event.COMPLETE, xmlLoaded);
			
			function xmlLoaded(e:Event):void {
				xml = new XML(e.target.data);
				preguntaLabel.text = xml.Preguntas.Tipo.cerrada.Enunciado[numero];
			}
		}
		/**
		 * Muestra las opciones posibles a la pregunta que ha elegido el servidor
		 * @param num Numero de la pregunta de la que hay que obtener respuestas
		 */
		public function MostrarOpcionesCerradas(num : Number) : void {
			
			var xml:XML;
			var loader:URLLoader = preguntas.Actions();
			loader.addEventListener(Event.COMPLETE, xmlLoaded);
			function xmlLoaded(e:Event):void {
				xml = new XML(e.target.data);
				opcionA.text = xml.Preguntas.Tipo.cerrada[num].Opciones[0];
				opcionB.text = xml.Preguntas.Tipo.cerrada[num].Opciones[1];
				opcionC.text = xml.Preguntas.Tipo.cerrada[num].Opciones[2];
				opcionD.text = xml.Preguntas.Tipo.cerrada[num].Opciones[3];
			}
		}
		/**
		 * Valida la respuesta que ha dado el usuario, luego se le notifica al servidor si ha respondido
		 * bien o mal el usuario.
		 * @param mouseEvent Evento generado por el usuario al dar click en enviar para enviar su respuesta a validacion
		 */
		public function onClickTecladoEnviarButton( mouseEvent:MouseEvent):void
		{
			limpiarPantalla();
			stop();
			gotoAndStop(2,"Escena 6");
			Main.minuteTimer.stop();
			minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
			trace ("Respuesta ");
			trace (" ");
			trace ("HAS SELECCIONADO:  " + respuestaAbierta.text );
			var validar :  Respuesta = new Respuesta( respuestaAbierta.text , aleatorio , "abierta", connection, this);
			if (Respuesta.perdio == true)
			{
				trace("Respondio mal");
				perder()
			}
				
		}
		/**
		 * Muestra en la ventana al usuario dos botones, uno para preguntas abiertas y otro para preguntas cerradas
		 */
		public function dibujarSeleccionCasosDeUso():void{
			
			limpiarPantalla();
			casoDeUsoLabel = new CasoDeUsoLabel();
			validarAbiertasButton = new ValidarRespuestasAbiertasButton();
			validarCerradasButton = new ValidarRespuestasCerradasButton();
			//Construccion del boton de Validar Respuestas Abiertas
			validarAbiertasButton.x = 160;
			validarAbiertasButton.y = 170;
			addChild(validarAbiertasButton);

			//Construccion del boton de Validar Respuestas Cerradas
			validarCerradasButton.x = 160;
			validarCerradasButton.y = 240;
			addChild(validarCerradasButton);
		}
		/**
		 * Muestra en la ventana al usuario los campos donde se mostrará la pregunta, teclado virtual y respuesta
		 */
		public function dibujarMostrarPreguntaAbierta():void {			
			limpiarPantalla();
			respuestaAbierta = new TextField();
			
			//Construccion campo de la pregunta
			preguntaLabel = new TextField();
			preguntaLabel.height = 33;
			preguntaLabel.width = 260;
			preguntaLabel.border = true;
			preguntaLabel.borderColor = 0xD7A500;
			preguntaLabel.textColor = 0xD7A500;
			preguntaLabel.background = true;
			preguntaLabel.backgroundColor = 0x000000;
			preguntaLabel.x = 14;
			preguntaLabel.y = 20;
			preguntaLabel.scaleX = 2.0;
			preguntaLabel.scaleY = 2.0;
			preguntaLabel.wordWrap = true;
			preguntaLabel.selectable = false;
			preguntaLabel.setTextFormat(formatearTitulos());
			addChild(preguntaLabel);
			
			//Construccion del campo del Nombre del Jugador
			nombre = new TextField();
			nombre.height = 40;
			nombre.width = 169;
			nombre.border = false;
			nombre.x = 10;
			nombre.y = 300;
			nombre.text = nombreJugador;
			nombre.setTextFormat(formatearTitulos());
			addChild(nombre);
			
			//Construccion del campo para responder la pregunta
			respuestaAbierta = new TextField();
			respuestaAbierta.height = 15;
			respuestaAbierta.width = 30;
			respuestaAbierta.border = true;
			respuestaAbierta.borderColor = 0xD7A500;
			respuestaAbierta.background = true;
			respuestaAbierta.backgroundColor = 0xFFFFFF;
			respuestaAbierta.x = 230;
			respuestaAbierta.y = 150;
			respuestaAbierta.setTextFormat(formatearTitulos());
			respuestaAbierta.scaleX = 2.0;
			respuestaAbierta.scaleY = 2.0;
			addChild(respuestaAbierta);
			
			teclado0Button = new Teclado0Button();
			addChild(teclado0Button);
			teclado1Button = new Teclado1Button();
			addChild(teclado1Button);
			teclado2Button = new Teclado2Button();
			addChild(teclado2Button);
			teclado3Button = new Teclado3Button();
			addChild(teclado3Button);
			teclado4Button = new Teclado4Button();
			addChild(teclado4Button);
			teclado5Button = new Teclado5Button();
			addChild(teclado5Button);
			teclado6Button = new Teclado6Button();
			addChild(teclado6Button);
			teclado7Button = new Teclado7Button();
			addChild(teclado7Button);
			teclado8Button = new Teclado8Button();
			addChild(teclado8Button);
			teclado9Button = new Teclado9Button();
			addChild(teclado9Button);
			tecladoBorrarButton = new TecladoBorrarButton();
			addChild(tecladoBorrarButton);
			tecladoEnviarButton = new TecladoEnviarButton();
			addChild(tecladoEnviarButton);
		}
		/**
		 * Valida la respuesta que ha dado el usuario, luego se le notifica al servidor si ha respondido
		 * bien o mal el usuario.
		 * @param mouseEvent Evento generado por el usuario al dar click en enviar para enviar su respuesta a validacion
		 */
		public function funcionAlHacerClick(event:MouseEvent):void
		{ 
			Main.minuteTimer.stop();
			minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
			trace ("Respuesta ");
			trace (" ");
			trace ("HAS SELECCIONADO:  " + respuestaAbierta.text );
			var validar :  Respuesta = new Respuesta( respuestaAbierta.text , aleatorio , "abierta", connection, this);
			limpiarPantalla();
			stop();
			gotoAndStop(2,"Escena 6");
			
			if (Respuesta.perdio)
				perder();
		}	
		/**
		 * Muestra en la ventana al usuario los campos para las posibles opciones y la pregunta. Adicional muestra 
		 * los botones para que el usuario escoja la respuesta que quiera. Cada boton es generado con su respectivo evento
		 * para detectar que respuesta escogió el usuario.
		 */
		public function dibujarMostrarPreguntaCerrada():void {
			
			limpiarPantalla();
			var cerrada : String = "cerrada";
			
			//Construccion de la pregunta cerrada
			preguntaLabel = new TextField();
			preguntaLabel.height = 33;
			preguntaLabel.width = 260;
			preguntaLabel.border = true;
			preguntaLabel.borderColor = 0xD7A500;
			preguntaLabel.textColor = 0xD7A500;
			preguntaLabel.background = true;
			preguntaLabel.backgroundColor = 0x000000;
			preguntaLabel.x = 14;
			preguntaLabel.y = 20;
			preguntaLabel.scaleX = 2.0;
			preguntaLabel.scaleY = 2.0;
			preguntaLabel.multiline = true;
			preguntaLabel.wordWrap = true;
			preguntaLabel.selectable = false;
			
			var formatoPregunta = new TextFormat();
			formatoPregunta.color = 0xD7A500;
			formatoPregunta.font = "Comic Sans MS";
			formatoPregunta.size = 16;
			formatoPregunta.display = "inLine";
			formatoPregunta.align = TextFormatAlign.CENTER;
			addChild(preguntaLabel);
			preguntaLabel.setTextFormat(formatoPregunta);
			//Construccion del boton de Opcion1 
			opcion1Button = new Opcion1Button();
			addChild(opcion1Button);
			opcion1Button.addEventListener(MouseEvent.CLICK, funcionAlHacerClickA);	
			
			function funcionAlHacerClickA(event:MouseEvent):void
			{ 
				Main.minuteTimer.stop();
				minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				trace ("Respuesta ");
				trace (" ");
				trace ("HAS SELECCIONADO LA OPCIÓN ( A ):  " + opcionA.text );
				var validar :  Respuesta = new Respuesta( opcionA.text.toString() , aleatorio , cerrada, connection, esteMain);
				limpiarPantalla();
				stop();
				gotoAndStop(2,"Escena 6");
				
				if (Respuesta.perdio)
					perder();
				
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
			}
			
			opcionA = new TextField();
			opcionA.height = 30;
			opcionA.width = 340;
			opcionA.border = true;
			opcionA.borderColor = 0xD7A500;
			opcionA.textColor = 0xD7A500;
			opcionA.background = true;
			opcionA.backgroundColor = 0x000000;
			opcionA.x = 20;
			opcionA.y = 130;
			addChild(opcionA);
			
			//Construccion del boton de Opcion2
			opcion2Button = new Opcion2Button();
			addChild(opcion2Button);
			
			opcion2Button.addEventListener(MouseEvent.CLICK, funcionAlHacerClickB);			
			function funcionAlHacerClickB(event:MouseEvent):void
			{ 
				Main.minuteTimer.stop();
				minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				trace ("Respuesta ");
				trace (" ");
				trace ("HAS SELECCIONADO LA OPCIÓN ( B ):  " + opcionB.text );
				var validar :  Respuesta = new Respuesta( opcionB.text.toString() , aleatorio , cerrada,connection, esteMain);
				limpiarPantalla();
				stop();
				gotoAndStop(2,"Escena 6");
				if (Respuesta.perdio)
					perder();
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
			}
			
			opcionB = new TextField();
			opcionB.height = 30;
			opcionB.width = 340;
			opcionB.border = true;
			opcionB.borderColor = 0xD7A500;
			opcionB.textColor = 0xD7A500;
			opcionB.background = true;
			opcionB.backgroundColor = 0x000000;
			opcionB.x = 20;
			opcionB.y = 190;
			addChild(opcionB);
			
			//Construccion del boton de Opcion3
			opcion3Button = new Opcion3Button();
			addChild(opcion3Button);
			opcion3Button.x = 20;
			opcion3Button.y = 230;
			
			opcion3Button.addEventListener(MouseEvent.CLICK, funcionAlHacerClickC);			
			function funcionAlHacerClickC(event:MouseEvent):void
			{ 
				Main.minuteTimer.stop();
				minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				trace ("Respuesta ");
				trace (" ");
				trace ("HAS SELECCIONADO LA OPCIÓN ( C ):  " + opcionC.text );
				var validar :  Respuesta = new Respuesta( opcionC.text.toString() , aleatorio , cerrada, connection, esteMain);
				limpiarPantalla();
				stop();
				gotoAndStop(2,"Escena 6");;
				if (Respuesta.perdio)
					perder();
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
			}
			opcionC = new TextField();
			opcionC.height = 30;
			opcionC.width = 340;
			opcionC.border = true;
			opcionC.borderColor = 0xD7A500;
			opcionC.textColor = 0xD7A500;
			opcionC.background = true;
			opcionC.backgroundColor = 0x000000;
			opcionC.x = 20;
			opcionC.y = 240;
			addChild(opcionC);
			
			//Construccion del boton de Opcion4
			opcion4Button = new Opcion4Button();
			addChild(opcion4Button);
			opcion4Button.x = 20;
			opcion4Button.y = 280;
			
			opcion4Button.addEventListener(MouseEvent.CLICK, funcionAlHacerClickD);			
			function funcionAlHacerClickD(event:MouseEvent):void
			{ 
				Main.minuteTimer.stop();
				minuteTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
				trace ("Respuesta ");
				trace (" ");
				trace ("HAS SELECCIONADO LA OPCIÓN ( D ):  " + opcionD.text );
				var validar :  Respuesta = new Respuesta( opcionD.text.toString() , aleatorio , cerrada, connection, esteMain);
				limpiarPantalla();
				stop();
				gotoAndStop(2,"Escena 6");
				
				if (Respuesta.perdio)
					perder();
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion1Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion2Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion3Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickA);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickB);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickC);
				opcion4Button.removeEventListener(MouseEvent.CLICK, funcionAlHacerClickD);
				
			}
			
			opcionD = new TextField();
			//label4.text = "OPCION 4 PRUEBA";
			opcionD.height = 30;
			opcionD.width = 340;
			opcionD.border = true;
			opcionD.borderColor = 0xD7A500;
			opcionD.textColor = 0xD7A500;
			opcionD.background = true;
			opcionD.backgroundColor = 0x000000;
			opcionD.x = 20;
			opcionD.y = 290;
			addChild(opcionD);
		}
		
		/**
		 * La funcion perder muestra al usuario que ha perdido, ya sea porque
		 * ha respondido correctamente pero se demoró más que otro usuario en 
		 * responder o porque respondió incorrectamente.
		 */
		public function perder():void{
			limpiarPantalla();
			gotoAndStop(1,"Escena 7");
			
		}
		//Cambia el atributo visible de todos los elementos visuales en pantalla a no visible.
		//Agregar TODO elemento nuevo a esta funcion, y cambiar su atributo .visible = false;
		public function limpiarPantalla():void {
			inicioButton.visible = false;
			nombre.visible = false;
			contrasenia.visible = false;
			casoDeUsoLabel.visible = false;
			validarAbiertasButton.visible = false;
			validarCerradasButton.visible = false;
			preguntaLabel.visible = false;
			opcion1Button.visible = false;
			opcion2Button.visible = false;
			opcion3Button.visible = false;
			opcion4Button.visible = false;
			respuestaAbierta.visible = false;
			teclado0Button.visible = false;
			teclado1Button.visible = false;
			teclado2Button.visible = false;
			teclado3Button.visible = false;
			teclado4Button.visible = false;
			teclado5Button.visible = false;
			teclado6Button.visible = false;
			teclado7Button.visible = false;
			teclado8Button.visible = false;
			teclado9Button.visible = false;
			tecladoBorrarButton.visible = false;
			tecladoEnviarButton.visible = false;
			asterisco1.visible = false;
			asterisco2.visible = false;
			mensajeError.visible = false;
			opcionA.visible = false;
			opcionB.visible = false;
			opcionC.visible = false;
			opcionD.visible = false;
			ip.visible=false;
		}
	    /**
		 * Genera un formato para mostrar texto.
		 * @return formatoTitulos Retorna el formato ya creado para ser usado al mostrar titulos
		 */
		public function formatearTitulos():TextFormat {
			
			formatoTitulos.color = 0xD7A500;
			formatoTitulos.font = "Comic Sans MS";
			formatoTitulos.size = 20;
			formatoTitulos.display = "inLine";
			formatoTitulos.align = TextFormatAlign.CENTER;
			return formatoTitulos;
		}
		
		/**
		 * Genera un formato para mostrar texto.
		 * @return formatoTextos Retorna el formato ya creado para ser usado al mostrar titulos
		 */
		public function formatearTextos():TextFormat {
			
			formatoTextos.color = 0xD7A500;
			formatoTextos.font = "Comic Sans MS";
			formatoTextos.size = 14;
			formatoTextos.display = "inLine";
			formatoTextos.align = TextFormatAlign.CENTER;
			return formatoTextos;
		}
		
	}
}
